package com.neu.dao.impl;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
import com.neu.dao.ImodelDao;
import com.neu.pojo.Model;

public class ModelDao implements ImodelDao{
	private File file1 = new File("model.json");//文件
	private ObjectMapper om = new ObjectMapper();//序列化objectmapper
	//单例模式
	private static ImodelDao modelDao = new ModelDao();
	private ModelDao() {}
	public static ImodelDao getInstance() {
		return modelDao;
	}
	
	//添加模板
	@Override
	public boolean add(Model m) {
		ArrayList<Model> models = new ArrayList<>();//模板容器
		try {
			models = this.om.readValue(file1,new TypeReference<List<Model>>(){});//反序列化
			for(Model model:models) {//遍历
				if(model.getId() == m.getId()) {//已经添加过
					return false;//返回
				}
			}
			models.add(m);//添加
			this.om.writeValue(file1, models);//重新写入
			return true;//返回真
		} catch (MismatchedInputException e) {//文件内无内容
			models.add(m);//添加
			try {
				this.om.writeValue(file1, models);//写入第一个元素
				return true;//返回真
			} catch (IOException e1) {
				e1.printStackTrace();
				return false;//返回错误
			}
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}
	
	//更新模板
	@Override
	public boolean cover(Model m) {//覆盖模板
		ArrayList<Model> models = new ArrayList<>();//模板容器
		try {
			models = this.om.readValue(file1,new TypeReference<List<Model>>(){});//反序列化
			for(int i=0;i<models.size();i++) {//遍历
				if(models.get(i).getId() == m.getId()) {//找到了
					models.get(i).setKind(m.getKind());//更新数据
					models.get(i).setName(m.getName());//更新数据
					this.om.writeValue(file1, models);//更新数据
					return true;//返回真
				}
			}
			return false;//返回假
		}catch (MismatchedInputException e) {
			return false;//返回假
		}catch (IOException e) {
			e.printStackTrace();
			return false;//返回假
		}
	}
	
	//搜索模板
	@Override
	public Model search(Model model) {
		ArrayList<Model> models = new ArrayList<>();//模板容器
		try {
			models = this.om.readValue(file1,new TypeReference<List<Model>>(){});//反序列化
			for(Model m:models) {//遍历
				if(m.getId() == model.getId()) {//找到了
					return m;//返回
				}
			}
			return null;//返回
		}catch (MismatchedInputException e) {//文件内无内容
			return null;//返回
		}catch (IOException e) {//异常
			e.printStackTrace();
			return null;//返回
		}
	}
	
	//搜索模板
	@Override
	public Model search(String s) {
		ArrayList<Model> models = new ArrayList<>();//模板容器
		try {
			models = this.om.readValue(file1,new TypeReference<List<Model>>(){});//反序列化
			for(Model m:models) {//遍历
				if(m.getName().equals(s)) {//找到了
					return m;//返回
				}
			}
			return null;//返回
		}catch (MismatchedInputException e) {//文件内无内容
			return null;//返回
		}catch (IOException e) {//异常
			e.printStackTrace();
			return null;//返回
		}
	}
	
	//得到数量
	@Override
	public int size() {
		ArrayList<Model> models = new ArrayList<>();//模板容器
		try {
			models = this.om.readValue(file1,new TypeReference<List<Model>>(){});//反序列化
			return models.size();//返回
		} catch (MismatchedInputException e) {//文件内无内容
			return 0;//返回
		} catch (IOException e) {//异常
			e.printStackTrace();
			return 0;//返回
		}
	}
	
	@Override
	public ArrayList<Model> list(){
		ArrayList<Model> models = new ArrayList<>();//模板容器
		try {
			models = this.om.readValue(file1,new TypeReference<List<Model>>(){});//反序列化
			return models;//返回
		}catch (MismatchedInputException e) {//文件内无内容
			return models;//返回
		}catch (IOException e) {//异常
			e.printStackTrace();
			return null;//返回
		}
	}
	
	@Override
	public boolean delete(Model m) {
		ArrayList<Model> models = new ArrayList<>();//模板容器
		try {
			models = this.om.readValue(file1,new TypeReference<List<Model>>(){});//反序列化
			for(int i=0;i<models.size();i++) {//遍历
				if(models.get(i).getId() == m.getId()) {
					models.remove(i);
					this.om.writeValue(file1, models);
					return true;//返回
				}
			}
			return false;//返回
		}catch (MismatchedInputException e) {//文件内无内容
			return false;//返回
		}catch (IOException e) {//异常
			e.printStackTrace();
			return false;//返回
		}
	}
	
	//测试，+数据
//	public static void main(String[] args) {
//		modelDao.add(new Model(1, "模板一", "A"));
//		modelDao.add(new Model(2, "模板二", "B"));
//		modelDao.add(new Model(3, "模板三", "C"));
//	}
}
